package com.chukun.disruptor.executors;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * @author 初坤
 * java 生产环境一定使用自定义的线程池
 */
public class JavaExecutorPool {

    public static void main(String[] args) {

        /**
         * 对于CPU密集型线程，可以将线程数设置为N(cpu)个，可以设置额外线程，因此可以设置为N(cpu)+1
         * IO密集型，优先考虑将线程设置为1，在一个线程不够用的情况下将线程数向2*N(cpu)靠近
         */
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
                Runtime.getRuntime().availableProcessors(),
                Runtime.getRuntime().availableProcessors() * 2,
                60,
                TimeUnit.SECONDS,
                new ArrayBlockingQueue<>(10),
                r -> {
                    Thread thread = new Thread(r);
                    //设置一些额外的信息
                    thread.setDaemon(true);
                    thread.setName("order-thread");
                    return thread;
                },
                (r, executor) ->{
                    //重写线程超过设置的线程怎么办
                    System.out.println("reject the thread");
            });
    }
}
